package com.mxin.log;

import com.mxin.common.GlobalApp;
import com.mxin.common.log.Log;
import com.mxin.common.log.LogInterface;
import com.mxin.common.log.LogObserver;

import java.util.ArrayList;
import java.util.List;

public class Logt implements LogInterface {

    private static String tag;
    //订阅者
    private static List<LogObserver> observers = new ArrayList<>();

    public String getTag(){
        if(tag==null){
            tag = GlobalApp.app.getPackageName();
        }
        return tag;
    }

    public void subscribe(LogObserver observer){
        if(!observers.contains(observer)){
            observers.add(observer);
        }
    }

    public void unSubscribe(LogObserver observer){
        observers.remove(observer);
    }


    public void setTag(String tag){
        Logt.tag = tag;
    }

    public void i(String msg){
        i(getTag(), msg);
    }

    public void i(String tag, String msg){
        emit(LogType.i, tag, msg);
    }

    public void d(String msg){
        d(getTag(), msg);
    }

    public void d(String tag, String msg){
        emit(LogType.d, tag, msg);
    }

    public void e(String msg){
        e(getTag(), msg);
    }

    public void e(String tag, String msg){
        emit(LogType.e, tag, msg);
    }

    public void v(String msg){
        v(getTag(), msg);
    }

    public void v(String tag, String msg){
        emit(LogType.v, tag, msg);
    }

    public void w(String msg){
        w(getTag(), msg);
    }

    public void w(String tag, String msg){
        emit(LogType.w, tag, msg);
    }

    private void emit(LogType logType, String tag, String content){
         switch (logType){
             case i:
                 android.util.Log.i(tag, content);
                 break;
             case d:
                 android.util.Log.d(tag, content);
                 break;
             case e:
                 android.util.Log.e(tag, content);
                 break;
             case v:
                 android.util.Log.v(tag, content);
                 break;
             case w:
                 android.util.Log.w(tag, content);
                 break;
         }

        if(observers.size()>0){
            Log log = new Log(System.currentTimeMillis(), logType.getTypeStr().toUpperCase(), tag, content);
            for (LogObserver observer : observers) {
                observer.observer(log);
            }
        }

    }

}
